package com.xc.xcrpc.utils;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.setting.dialect.Props;
import org.yaml.snakeyaml.Yaml;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Map;
import java.util.Properties;

/**
 * 配置工具类
 */
public class ConfigUtils {

    /**
     * 加载配置对象
     *
     * @param tClass
     * @param prefix
     * @param <T>
     * @return
     */
    public static <T> T loadConfig(Class<T> tClass, String prefix) {
        return loadConfig(tClass, prefix, "");
    }

    /**
     * 加载配置对象，支持区分环境
     *
     * @param tClass
     * @param prefix
     * @param environment
     * @param <T>
     * @return
     */
    public static <T> T loadConfig(Class<T> tClass, String prefix, String environment) {
        StringBuilder configFileBuilder = new StringBuilder("application");
        if (StrUtil.isNotBlank(environment)) {
            configFileBuilder.append("-").append(environment);
        }
        configFileBuilder.append(".properties");
        Props props = new Props(configFileBuilder.toString());
        return props.toBean(tClass, prefix);
    }
    // todo 这里还可以实现配置不同的配置文件
//    public static <T> T loadConfig(Class<T> tClass, String prefix, String environment) {
//        StringBuilder configFileBuilder = new StringBuilder("application");
//        if (StrUtil.isNotBlank(environment)) {
//            configFileBuilder.append("-").append(environment);
//        }
//        String propertiesFileName = configFileBuilder.append(".properties").toString();
//        String ymlFileName = configFileBuilder.append(".yml").toString();
//
//        Object configData = null;
//        if (FileUtil.exist(propertiesFileName)) {
//            Props props = new Props();
//            try {
//                props.load(FileUtil.file(propertiesFileName).inputStream());
//                configData = props;
//            } catch (Exception e) {
//                throw new RuntimeException("加载 properties 配置文件失败", e);
//            }
//        } else if (FileUtil.exist(ymlFileName)) {
//            try {
//                Yaml yaml = new Yaml();
//                Map<String, Object> yamlData = yaml.loadAs(new FileInputStream(ymlFileName), Map.class);
//                if (StrUtil.isNotBlank(prefix)) {
//                    Map<String, Object> subMap = (Map<String, Object>) yamlData.get(prefix);
//                    if (subMap != null) {
//                        yamlData = subMap;
//                    }
//                }
//                configData = yaml.loadAs(yaml.dumpAsMap(yamlData), tClass);
//            } catch (FileNotFoundException e) {
//                throw new RuntimeException("配置文件未找到", e);
//            }
//        } else {
//            throw new RuntimeException("找不到任何有效的配置文件");
//        }
//
//        if (configData instanceof Properties) {
//            return ((Properties) configData).toBean(tClass, prefix);
//        } else {
//            return (T) configData;
//        }
//    }

}
